#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
系统日志拦截转发UI模块
提供将日志信息转发到UI界面的功能
"""

import logging
import sys
from typing import Optional, Any


class UILoggingHandler(logging.Handler):
    """
    自定义日志处理器，根据是否有UI实例决定日志输出目标：
    1. 如果没有UI实例，则将日志输出到控制台
    2. 如果有UI实例，则将日志转发到UI界面
    """
    
    _ui_instance: Optional[Any] = None
    
    def __init__(self):
        super().__init__()
        # 设置默认的日志格式
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        self.setFormatter(formatter)
    
    @classmethod
    def set_ui_instance(cls, ui: Any) -> None:
        """
        设置UI实例
        
        Args:
            ui: UI实例，需要有append_system_output方法
        """
        cls._ui_instance = ui
        
    def emit(self, record: logging.LogRecord) -> None:
        """
        处理日志记录，根据是否有UI实例决定输出目标
        
        Args:
            record: 日志记录
        """
        try:
            msg = self.format(record)
            if self.__class__._ui_instance is not None:
                # 如果有UI实例，则将日志转发到UI
                self.__class__._ui_instance.append_system_output(msg + '\n')
            else:
                # 如果没有UI实例，则输出到控制台
                print(msg, file=sys.stderr)
        except Exception:
            self.handleError(record)


# 在模块级别暴露set_ui_instance函数
def set_ui_instance(ui: Any) -> None:
    """
    设置UI实例
    
    Args:
        ui: UI实例
    """
    UILoggingHandler.set_ui_instance(ui)